<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <script>

        // const arr = new Array(1, 2, 3);
        // const boxes = document.querySelectorAll('.box');

        // console.log(boxes.map);

        // // 静态方法
        // const abc = Array.from(boxes);

        // console.log(abc.map);

        // const obj = {
        //     a: 1,
        //     b: 2,
        // };

        // // ['a', 'b']
        // console.log( Object.keys(obj) );
        
        // console.log( Math.pow(2, 2) );

        // console.log( Date.now() );
        // const d = new Date();
        // console.log( d.getFullYear() ); // 
        // console.log( d.now() ); //  Error

        // class A {
        //     getAvg () {

        //     }
        //     // 
        //     static getSum () {

        //     }
        // }

        // A.getSum();

        // const obj = {
        //     a () {
        //         console.log(1);
        //     },
        // // };

        // // const obj1 = obj;

        // // obj1.a();

        // function Star (name) {
        //     this.name = name;
        // }

        // Star.prototype.sing = function () {
        //     console.log(this);
        // };
        // Star.prototype.dance = function () {
        //     console.log(this);
        // };

        // Star.prototype = function () {
        //     console.log(1);
        // };

        // Star.sayHi = function () {
        //     console.log(this);
        // };

        // const ldh = new Star('刘德华');
        // // ldh.sing();
        // // Star.sayHi();

        // // console.log(Star.prototype); // []
        // // console.log(ldh.__proto__); // []
        // console.log(Star.prototype.constructor); // Function


        // const person = { name: 'zhangsan' };
        // const arr = [{ name: 'zhangsan' }]; // new Array()

        // // console.log(arr.keys().next()); // generator 生成器函数 es7
        // console.log(arr.includes({ name: 'zhangsan' })); // false

        // .reverse  .map
        // .some .filter
        // .length .keys
        // .sort .splice
        // .pop .every 
        // .shift .unshift .join
        // .push .indexOf
        // .toString .values
        // .find .flat
        // .findIndex .includes({name: 'zhangsan'})

        // 

        // const obj = {
        //     a: 1,
        //     b: 2,
        // };

        // // obj['b']
        // // obj.b

        // const arr = [
        //     { key: 'a', value: 1 },
        //     { key: 'b', value: 1 },
        //     { key: 'b', value: 1 },
        //     { key: 'b', value: 1 },
        //     { key: 'b', value: 1 },
        //     { key: 'z', value: 1 },
        // ];

        // // arr[8]

        // // console.log(obj.__proto__); // { ... }
        // // console.log(obj.__proto__.constructor); // Object

        // const arr = [];

        // console.log(arr.__proto__); // { map, filter, pop, push }
        // console.log(Array.prototype); // { map, filter, pop, push }

        // console.log(Array.prototype.__proto__); // { ... }
        // console.log(Array.prototype.__proto__.constructor); // Object

        // console.log(Array.__proto__); // function () {}
        // console.log(Array.__proto__.prototype); // undefined
        // console.log(Function.prototype); // fn
        // console.log(Array.prototype); // {}
        // console.log(Object.prototype); // {}

        
    
        // function fn () {

        // }

        // // Function
        // // fn.bind
        // // console.log(fn.__proto__); // {}
        // // console.log(Function.prototype); // fn
        // console.dir(fn.__proto__)
        // console.dir(Function.prototype); // call bind apply

        // console.dir(Function);

        // Function.prototype.bind = function () {

        // };

        // 实例上找__proto__
        // 构造函数找prototype

        const arr = [1, 2, 3, 4];

        // arr.map arr.filter

        // // 乱序
        // Array.prototype.mass = function () {
        //     // console.log(this);
        //     return this.sort(function () {
        //         // 0 ~ 1
        //         // -0.5 ~ 0.5
        //         return Math.random() - .5;
        //     });
        // };
        // console.log(arr.mass());

        // 添加一个求和功能
        // 添加一个求最大值功能

        // Array.prototype.getSum = function () {
        //     let sum = 0
        //     for (let i = 0; i < this.length; i++) {
        //         sum += this[i]
        //     }
        //     return sum
        // }

        // Array.prototype.getMax = function () {
        //     return Math.max(...this);
        // }

        // Array.prototype.getSum = function () {
        //     return this.reduce(function (prevResult, current) {
        //         return prevResult + current;
        //     });
        // }

        // Array.prototype.getSum = function () {
        //     const eq = this.join('+');
        //     return eval(eq);
        // }

        // arr.getSum();

        // function fn (x, y) {
        //     console.log(this, x + y);
        // }

        // const obj = {
        //     a: 1,
        // };

        // fn(1, 2); // window 3
        // fn.call(obj, 1, 2); // obj 3
        // // fn.call(1, 2);  xxx

        // fn.apply(obj, [1, 2]); // obj 3

        // const fn1 = fn.bind(obj); // 装饰者
        // fn1(2, 4);
        
        var i; // 5
        for (i = 0; i < 5; i++) {
            setTimeout(function () {
                console.log(i); // 5
            }, 1000 * i); // 0 ~ 4
            console.log(i); // 0 ~ 4
        }

        // 0s: 5
        // 1s: 5
        // 2s: 5
        // ... 
        
        for (var i = 0; i < 5; i++) {
            (function fn (index) {
                setTimeout(function () {
                    console.log(index); // 5
                }, 1000 * index); // 0 ~ 4
                console.log(index); // 0 ~ 4
            })(i);
        }


    </script>
</body>
</html>